/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.np2tec.soa.servicos;

import br.np2tec.soa.entidades.Funcionario;
import br.np2tec.soa.entidades.Peca;
import br.np2tec.soa.entidades.PropostaCredito;
import br.np2tec.soa.entidades.Cliente;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.Stateless;
import javax.jws.WebService;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.xml.ws.WebServiceRef;

@Stateless
@WebService()
public class TratarPropostaCreditoDataService {

    @WebServiceRef(wsdlLocation = "http://localhost:8080/TratarClienteDataServiceService/TratarClienteDataService?WSDL")
    TratarClienteDataServiceService clienteDataService;
    @PersistenceContext(unitName = "TratarPropostaCreditoDataServicePU")
    EntityManager em;

    public PropostaCredito consultarPropostaCredito(Long numeroPropostaCredito) {
        PropostaCredito propostaCredito = null;
        Query query = em.createQuery("SELECT pc FROM PropostaCredito pc WHERE pc.numeroProposta = :numeroProposta");
        query.setParameter("numeroProposta", numeroPropostaCredito);
        try {
            propostaCredito = (PropostaCredito) query.getSingleResult();
        } catch (javax.persistence.NoResultException e) {
        }

        return propostaCredito;
    }

    public List listarPropostaCreditoCpfCliente(String cpf) {
        Query query = em.createQuery("SELECT pc FROM PropostaCredito pc WHERE pc.cliente.cpf = :cpf");
        query.setParameter("cpf", cpf);
        List listaPropostaCredito = query.getResultList();
        return listaPropostaCredito;
    }

    public List listarPropostaCreditoPorCliente(Cliente cliente) {
        Query query = em.createQuery("SELECT pc FROM PropostaCredito pc WHERE pc.cliente.id = :idCliente");
        query.setParameter("idCliente", cliente.getId());
        List listaPropostaCredito = query.getResultList();
        return listaPropostaCredito;
    }

    public List listarPropostaCreditoPorResultadoVerificacao(String resultadoVerificacao) {
        Query query = em.createQuery("SELECT pc FROM PropostaCredito pc WHERE pc.resultadoVerificacao = :resultadoVerificacao");
        query.setParameter("resultadoVerificacao", resultadoVerificacao);
        List listaPropostaCredito = query.getResultList();
        return listaPropostaCredito;
    }

    public List listarPropostaCredito() {
        Query query = em.createQuery("SELECT pc FROM PropostaCredito pc");
        List listaPropostaCredito = query.getResultList();
        return listaPropostaCredito;
    }

    public void excluirPropostaCredito(Long numeroPropostaCredito) {
        PropostaCredito propostaCredito = consultarPropostaCredito(numeroPropostaCredito);
        em.remove(propostaCredito);
    }

    public void alterarPropostaCredito(Double valorFinanciado, Integer numeroParcelas, String resultadoVerificacao, List<Peca> pecas, Long numeroPropostaCredito) {
        PropostaCredito propostaCredito = consultarPropostaCredito(numeroPropostaCredito);

        if (propostaCredito != null) {

            if (numeroParcelas != null) {
                propostaCredito.setNumeroParcelas(numeroParcelas);
            }

            if (resultadoVerificacao != null) {
                propostaCredito.setResultadoVerificacao(resultadoVerificacao);
            }

            if (valorFinanciado != null) {
                propostaCredito.setValorFinanciado(valorFinanciado);
            }

            if (numeroPropostaCredito != null) {
                propostaCredito.setNumeroProposta(numeroPropostaCredito);
            }

            //TODO verificar
            if (pecas != null) {
               propostaCredito.setPecas(pecas);
            }
        }
        em.merge(propostaCredito);
    }

    public void incluirPropostaCreditoPorServico(Double valorFinanciado, Integer numeroParcelas, String resultadoVerificacao,
            String cpfFuncionario, String cpfCliente, List<Peca> pecas, Long numeroPropostaCredito) {

        PropostaCredito propostaCredito = new PropostaCredito();
        propostaCredito.setDataCadastro(new Date());
        propostaCredito.setNumeroParcelas(numeroParcelas);
        propostaCredito.setResultadoVerificacao(resultadoVerificacao);
        propostaCredito.setValorFinanciado(valorFinanciado);
        propostaCredito.setNumeroProposta(numeroPropostaCredito);

        Funcionario funcionario = consultarFuncionario(cpfFuncionario);
        propostaCredito.setFuncionario(funcionario);

        br.np2tec.soa.servicos.Cliente clienteDS = clienteDataService.getTratarClienteDataServicePort().consultar(cpfCliente);

        Cliente cliente = new Cliente();

        try {
            // BeanUtils.copyProperties(cliente, clienteDS);
        } catch (Throwable ex) {
            Logger.getLogger(TratarPropostaCreditoDataService.class.getName()).log(Level.SEVERE, null, ex);
        }

        cliente.setId(clienteDS.getId());

        propostaCredito.setCliente(cliente);

        em.persist(propostaCredito);

    }

    public void incluirPropostaCreditoPorBD(Double valorFinanciado, Integer numeroParcelas, String resultadoVerificacao,
            String cpfFuncionario, String cpfCliente, List<Peca> pecas, Long numeroPropostaCredito) {

        PropostaCredito propostaCredito = new PropostaCredito();
        propostaCredito.setDataCadastro(new Date());
        propostaCredito.setNumeroParcelas(numeroParcelas);
        propostaCredito.setResultadoVerificacao(resultadoVerificacao);
        propostaCredito.setValorFinanciado(valorFinanciado);
        propostaCredito.setNumeroProposta(numeroPropostaCredito);

        Funcionario funcionario = consultarFuncionario(cpfFuncionario);
        propostaCredito.setFuncionario(funcionario);

        Cliente cliente = consultarCliente(cpfCliente);
        propostaCredito.setCliente(cliente);

        propostaCredito.setPecas(pecas);
        try {
            em.persist(propostaCredito);

        } catch (Exception e) {
            e.printStackTrace();
        }


    }

    private Funcionario consultarFuncionario(String cpfFuncionario) {
        Query query = em.createNamedQuery("Funcionario.consultarFuncionario");
        query.setParameter("cpf", cpfFuncionario);
        Funcionario funcionario = null;

        try {
            funcionario = (Funcionario) query.getSingleResult();
        } catch (javax.persistence.NoResultException e) {
        }

        return funcionario;
    }

    private Cliente consultarCliente(String cpf) {
        Cliente cliente = null;
        Query q = em.createQuery("select c from Cliente c where c.cpf = :cpfParam");
        q.setParameter("cpfParam", cpf);

        try {
            cliente = (Cliente) q.getSingleResult();
        } catch (javax.persistence.NoResultException nre) {
        }

        return cliente;
    }
}
